package generator.datastructure;

import java.util.ArrayList;
import java.util.Iterator;


/**
 * Esta clase representa un punto de bifurcación el cual se encuentra en el 
 * método a ser gridificado. Se representan mediante una sentencia de asignación.
 * El lado izquierdo contiene el nombre de lo que se denomina "variable grid".
 * Esta se usa pura y exclusivamente para alojar el resultado de un llamado recusivo
 * al método. Representa una de las convenciones a respetar para que el proceso de
 * gridificacion automatizado pueda ser realizado con éxito.
 * Por su parte, el lado derecho de la asignación es un simple llamado recursivo al
 * método que se pretende gridificar o ejecutar distribuidamente.
 * 
 * @author Hirsch-Fernández*/
public abstract class ForkPoint {

	/**Representa el nombre de la variable que alojará el resultado de un llamado
	 * recursivo*/
	private String gridVariableName;
	
	/**Representa la declaración del método al cual pertenece el punto de bifurcación
	 * que cohincide con la la declaración del método que se pretende gridificar.**/
	private MethodDeclaration methodOwner;
	
	/**Representa la lista de nombres de los parámetros reales pasados como argumentos en el 
	 * llamado al método recursivo. Si se pretende conocer el tipo de dichos parámetros,
	 * podría ser de utilidad inspeccionar el atributo {@link methodOwner} que contiene la
	 * declaración del método recursivo.*/
	private ArrayList<String> realParams;
	
	/**Constructor vacío de la clase con el cual ninguno de sus atributos cobra valor*/
	public ForkPoint(){
		
	}
	
	/**@param gridVaribleName
	 * 			Representa el nombre de la variable que alojará el resultado de un llamado
	 * recursivo
	 * @param methodDec
	 * 			Representa la declaración del método al cual pertenece el punto de bifurcación
	 * que cohincide con la la declaración del método que se pretende gridificar
	 * @param params
	 * 			Representa la lista de nombres de los parámetros reales pasados como argumentos en el 
	 * llamado al método recursivo
	 * @return una instancia de la clase con todos sus atributos seteados*/
	public ForkPoint(String gridVaribleName, MethodDeclaration methodDec, ArrayList<String> params){
		this.gridVariableName = gridVaribleName;
		methodOwner = methodDec;
		this.realParams = params;
	}
	
	/**@return el nombre de la variable grid que aloja el resultado del punto de bifurcación*/
	public String getGridVariableName(){
		return gridVariableName;
	}

	/**@param gridVariableName
	 * 			el nombre de la variable grid que aloja el resultado del punto de bifurcación*/
	public void setGridVariableName(String gridVariableName) {
		this.gridVariableName = gridVariableName;
	}
		
	/**@return Objeto que representa la declaración del método al cual pertenece el punto
	 * de bifurcación*/
	public MethodDeclaration getMethodOwner() {
		return methodOwner;
	}

	/**@param methodOwner
	 * 			Objeto que representa la declaración del método al cual pertenece el punto
	 *  de bifurcación*/
	public void setMethodOwner(MethodDeclaration methodOwner) {
		this.methodOwner = methodOwner;
	}

	/**@return Objeto que representa la lista de nombres de los parámetros reales pasados
	 * como argumentos en el llamado al método recursivo*/
	public ArrayList<String> getRealParams() {
		return realParams;
	}

	/**@param Objeto que representa la lista de nombres de los parámetros reales pasados
	 * como argumentos en el llamado al método recursivo*/
	public void setRealParams(ArrayList<String> realParams) {
		this.realParams = realParams;
	}
	
	/**@return retorna un iterador que permitirá recorrer de izq a derecha la lista de
	 * parámetros reales pasados en el llamado recursivo o punto de bifurcación.*/
	public Iterator<String> realParameters(){
		return realParams.iterator();
	}
	
	/**@return retorna el nombre del método recursivo que compone el lado derecho del
	 * punto de bifurcación.*/
	public String getMethodName(){
		return methodOwner.getMethodName();
	}

	/**@return true si el punto de bifurcación en realidad es una declaración de variable
	 * seguida de la asignación de valor. False si se trata de una simple asignación.*/
	public abstract boolean hasDeclaration();


}
